﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs


Namespace Comptes

    ''' <summary>
    ''' Représente les besoins en fond propres
    ''' </summary>
    ''' <remarks></remarks>
    Public Class CompteBesoinsFondsPropres_V2
        Inherits CalculCompose

        Private _parametresEntree As Parametres

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
            MyBase.New()
            _resultats = New ResultatsCompteBesoinsFondsPropres
        End Sub

        ''' <summary>
        ''' Données initiales utilisées pour faire les calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ParametresEntree() As Parametres
            Get
                Return _parametresEntree
            End Get
            Friend Set(ByVal value As Parametres)
                _parametresEntree = value
            End Set
        End Property

        ''' <summary>
        ''' Résultats des calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads ReadOnly Property Resultats() As ResultatsCompteBesoinsFondsPropres
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub procedureCalcul()

            Dim resultatsCalcul As New ResultatsCompteBesoinsFondsPropres

            With _parametresEntree

                ReDim resultatsCalcul.MSRvie(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.MSRnonVie(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.CapiAllouesVie(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.CapiAllouesNonVie(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.CapiAlloues(.nbAnneesProjetees - 1)

                For i = 1 To .nbAnneesProjetees

                    If i <= .MSRvie.Count Then
                        'Calcul de la marge en non vie
                        'Plafond pour les primes : 57 500 000
                        'Plafond pour les sinistres : 40 300 000
                        resultatsCalcul.MSRvie(i - 1) = .MSRvie(i - 1)
                        Dim p1 As Double = 0.18 * Math.Min(10000000, .PcomINCINV(i - 1) / (1 + .TaxeAssurance))
                        Dim p2 As Double = 0.16 * Math.Max(.PcomINCINV(i - 1) / (1 + .TaxeAssurance) - 10000000, 0)
                        Dim s1 As Double = 0.26 * Math.Min(35000000, .SinRegINCINV(i - 1))
                        Dim s2 As Double = 0.23 * Math.Max(.SinRegINCINV(i - 1) - 35000000, 0)
                        resultatsCalcul.MSRnonVie(i - 1) = p1 + p2 + s1 + s2
                        resultatsCalcul.CapiAllouesVie(i - 1) = .MSRvie(i - 1) * .RatioFdsPropresSurMSR
                        resultatsCalcul.CapiAllouesNonVie(i - 1) = resultatsCalcul.MSRnonVie(i - 1) * .RatioFdsPropresSurMSR
                        resultatsCalcul.CapiAlloues(i - 1) = resultatsCalcul.CapiAllouesNonVie(i - 1) + resultatsCalcul.CapiAllouesVie(i - 1)
                    Else
                        resultatsCalcul.MSRvie(i - 1) = 0
                        resultatsCalcul.MSRnonVie(i - 1) = 0
                        resultatsCalcul.CapiAllouesVie(i - 1) = 0
                        resultatsCalcul.CapiAllouesNonVie(i - 1) = 0
                        resultatsCalcul.CapiAlloues(i - 1) = 0
                    End If
                Next

            End With
            _resultats = resultatsCalcul

        End Sub

        ''' <summary>
        ''' Résultat de l' évaluation des besoins en fond propre
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ResultatsCompteBesoinsFondsPropres

            ''' <summary>
            ''' Représente la marge de solvabilité reglementaire VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property MSRvie As Double()

            ''' <summary>
            ''' Représente la marge de solvabilité reglementaire NON-VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property MSRnonVie As Double()

            ''' <summary>
            ''' Représente le capital alloué VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapiAllouesVie As Double()

            ''' <summary>
            ''' Représente le capital alloué NON-VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapiAllouesNonVie As Double()

            ''' <summary>
            ''' Représente le taotal des capitaux alloués
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapiAlloues As Double()


            ''' <summary>
            ''' Fait une copie des données
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function Copy() As ResultatsCompteBesoinsFondsPropres
                Dim result As New ResultatsCompteBesoinsFondsPropres
                Dim MSRvie_copy(MSRvie.Count - 1) As Double
                Dim MSRnonVie_copy(MSRnonVie.Count - 1) As Double
                Dim capiAllouesVie_copy(capiAllouesVie.Count - 1) As Double
                Dim capiAllouesNonVie_copy(capiAllouesNonVie.Count - 1) As Double
                Dim capiAlloues_copy(capiAlloues.Count - 1) As Double
                For i = 0 To MSRvie.Count - 1
                    MSRvie_copy(i) = MSRvie(i)
                    MSRnonVie_copy(i) = MSRnonVie(i)
                    capiAllouesVie_copy(i) = capiAllouesVie(i)
                    capiAllouesNonVie_copy(i) = capiAllouesNonVie(i)
                    capiAlloues_copy(i) = capiAlloues(i)
                Next
                result.MSRvie = MSRvie_copy
                result.MSRnonVie = MSRnonVie_copy
                result.capiAllouesVie = capiAllouesVie_copy
                result.capiAllouesNonVie = capiAllouesNonVie_copy
                result.capiAlloues = capiAlloues_copy
                Return result
            End Function
        End Class

        ''' <summary>
        ''' Parametre utilisé pour calculer les besoins en fond propres
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Parametres

            ''' <summary>
            ''' Représente le nombre d'années de projection
            ''' </summary>
            ''' <remarks></remarks>
            Public Property nbAnneesProjetees As Integer

            ''' <summary>
            ''' Représente la marge de solvabilité reglementaire VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property MSRvie As Double()

            ''' <summary>
            ''' Représente les primes commeriales pour les risques INCAPACITE-INVALIDITE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PcomINCINV As Double()

            ''' <summary>
            ''' Représente le montant des sinsistres réglés pour les rsques INCAPACTIE-INVALIDITE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SinRegINCINV As Double()

            ''' <summary>
            ''' Représente la taxe d'assurance
            ''' </summary>
            ''' <remarks></remarks>
            Public Property TaxeAssurance As Double

            ''' <summary>
            ''' Représente le ratio des fonds propres sur la marge reglementaire de solvbilité
            ''' </summary>
            ''' <remarks></remarks>
            Public Property RatioFdsPropresSurMSR As Double
        End Class

    End Class


End Namespace